237. GCP IAM綁GKE的RBAC

WHY

要弄個小程式定時撈secret的資料出來,
但叢集是舊的沒有開啟workload Identity,
也只能掛IAM的service account了。
只給予Kubernetes Engine Viewer的權限,
但要撈secret時,會通知缺乏container.secrets.get的權限。

Solution

  1. 檢查Kubernetes Engine Viewer有哪些權限

237-fig.1.png

網頁查詢

另一種透過指令的方式,參考上圖中的role將值帶入到下面指令。

gcloud iam roles describe roles/container.viewer

(我很想吐槽,我怎麼知道這個名稱要用哪個role去查啊,還不是要去網頁看)

ref. 查看 IAM 角色授予的權限

查完的結果是真的缺乏 container.secrets.get的權限。
那現在的問題是,要怎麼加權限?

  1. 釐清認證方式
    Google 文件說明
    您可以使用 IAM 和 Kubernetes RBAC 來控制對 GKE 叢集的存取權:

在 GKE 中,IAM 和 Kubernetes RBAC 整合在一起,您可以通過任一工具向使用者授權,使其有足夠的權限執行操作。這對於 GKE 叢集的引導過程至關重要,因為默認情況下,Google Cloud 使用者不具有任何 Kubernetes RBAC RoleBindings。

ref. 使用基於角色的存取權控制向叢集中的操作授權

所以說預設的角色權限就是那些,要針對角色加權限的話只能自己新增了。

  1. 新增RBAC權限

ClusterRoleBinding 使用 kind: user,綁定IAM的帳號。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secret-reader
rules:
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get", "list", "watch"]
--- 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: secret-reader-binding
subjects:
  - kind: User  # 或者 ServiceAccount 根據具體的需求
    name: get-api@project.iam.gserviceaccount.com  # 替換成具體的使用者或服務帳號名稱
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io
  1. 驗證方式

綁完後,可使用指令看看能不能正常讀取。

kc auth can-i get secret iplc-test-com-tls \
-o=jsonpath='{.data.tls\.crt}' \
--as get-api@project.iam.gserviceaccount.com

可讀取會顯示 Yes,否則就是 No

ref. Checking API access